#!/usr/bin/env python

import math
import cairo,Image,glob
import re
class Dessin:
		
	def __init__(self,fichier):
		self.fichier=fichier
	
	def dessiner(self,fichier,listdico,step):
		##REGEX POUR CONVERTIR LIMAGE de nimporte quel format en PNG :
		#fichier="/test/essai/essai.jpg"
		regex=re.compile('(.*)\..*')
		result_regex=regex.findall(fichier)	
		fichierpng=result_regex[0]
		# image enregistrer en png pour traitement
		im =  Image.open(fichier)
		im.save(fichierpng+str("_mesure.png"),"PNG")
		#surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
		#print fichierpng+str(".png")
		
		# creation de la surface utiliser pour les formes geometriques de cairo
		surface = cairo.ImageSurface.create_from_png(fichierpng+str("_mesure.png"))
		ctx = cairo.Context (surface)
		ctx.scale(surface.get_width(),surface.get_height())
		WIDTH=surface.get_width()
		HEIGHT=surface.get_height()
		# epaisseur des traits et de leurs couleurs en fonction de la taille de l'image
		if WIDTH <=400 and HEIGHT <= 400:
			ctx.set_line_width(max(ctx.device_to_user_distance(2,2)))
		else:
			ctx.set_line_width(max(ctx.device_to_user_distance(5,5)))
		ctx.set_source_rgb(0,0,0)
		#ctx.set_line_width(0.1)
		## CONVERSION DE LIMAGE EN PNG ET ROTATION SI NECESSAIRE
		#CREATION DES CROIX
		size= 0.02*((float)(step)/100.0)
		#if step == 50:
		
		proportionX=0.0
		proportionY=0.0
		for element in listdico:
#gestion des proportions du a cairo si x > y => si pas de gestion des proportions la croix sera plus longue en largeur qu'en hauteur
			if WIDTH > HEIGHT :
				proportionX=(float)(HEIGHT)/(float)(WIDTH)
				proportionY=1.0
			else:
				proportionX=1.0
				proportionY=(float)(WIDTH)/(float)(HEIGHT)
#Creation de deux traits formant une croix
		
				#VERTICAL
			ctx.move_to((float)(element["x"])/(float)(WIDTH),((float)(element["y"])/(float)(HEIGHT))+size*proportionY)
			ctx.line_to((float)(element["x"])/(float)(WIDTH),((float)(element["y"])/(float)(HEIGHT))-size*proportionY)

			#HORIZONTAL
			ctx.move_to(((float)(element["x"])/(float)(WIDTH))+size*proportionX,(float)(element["y"])/(float)(HEIGHT))
			ctx.line_to(((float)(element["x"])/(float)(WIDTH))-size*proportionX,(float)(element["y"])/(float)(HEIGHT))
			ctx.stroke()
		        	

		surface.write_to_png(fichierpng+str("_mesure.png"))



## UN AUTRE PROGRAMME REMPLI LE TABLEAU => initialise tt les coordonnes a 0
# dico["x"]
# dico["y"]
# dico["shape"]=>initialisation a vide
# puis choisit soit on la fait soit on la fait pas
# si on la fait pas dico["shape"]=rien
# si on la fait rond l'actuelle dico["shape"]=rond
# si on la deja faite dico["shape"]=carre
## APPEL le debut de mon programme pour les croix
## APPEL 2eme partie de mon programme pour dessiner les ROND ET LES CARRE
## RECOIT un dico avec la mesure actuelle et la precedente
	def encours(self,fichier,listdico):
		regex=re.compile('(.*)\..*')
		result_regex=regex.findall(fichier)	
		fichierpng=result_regex[0]
		#print fichierpng+str("_mesure.png")
		surface = cairo.ImageSurface.create_from_png(fichierpng+str("_mesure.png"))
		ctx = cairo.Context (surface)
		ctx.scale(surface.get_width(),surface.get_height())
		WIDTH=surface.get_width()
		HEIGHT=surface.get_height()
		pi=3.14
# gestion des proportions
		if WIDTH > HEIGHT :
			proportionX=(float)(HEIGHT)/(float)(WIDTH)
			proportionY=1.0
		else:
			proportionX=1.0
			proportionY=(float)(WIDTH)/(float)(HEIGHT)
		for element in listdico:
# CREATION CARRE avec gestion des proportions:

			if element["shape"]=="carre":
				# CREATION RECTANGLE :
				# code RGB ici le rouge
				ctx.set_source_rgb(0,0,1)
				# creation dun rectangle proportion
				# 2 premiers parametres le  X et le Y et de depart et les 2 suivants la longueur
				ctx.rectangle(element["x"]/(float)(WIDTH) - 0.025*proportionX , element["y"]/(float)(HEIGHT) - 0.025*proportionY, 0.05*proportionX, 0.05*proportionY)
				ctx.fill()
				
# CREATION ROND  avec gestion des proportions:
			if element["shape"]=="rond":
					ctx.set_source_rgb(1,0,0)
					#element["shape"]="carre"
					ctx.save()
					
					#print proportionY
					#ctx.scale(proportionX,1)
					if proportionX < 1:
						ctx.scale(proportionX,1)
						#X et Y du cercle taille et son diametre
						ctx.arc((element["x"]/(float)(WIDTH))*(1.0/proportionX),element["y"]/(float)(HEIGHT), 0.02, 0, 2*pi)					
					if proportionY < 1 :
		
						ctx.scale(1,proportionY)
						ctx.arc((element["x"]/(float)(WIDTH)),element["y"]/(float)(HEIGHT)*(1.0/proportionY), 0.02, 0, 2*pi)
					ctx.restore()
        				ctx.fill()
		surface.write_to_png (fichierpng+str("_mesure.png"))


		#surface.write_to_png (fichier)
			
		return listdico

if __name__=="__main__":
	obj=Dessin("un")
	#obj.dessiner("plaveckycastle.png",25)
	listdico=[]
	dico={}	
	for a in range(25,300,25):
			for b in range(25,225,25):
				dico["x"]=a
				dico["y"]=b
				dico["shape"]="rond"
				listdico.append(dico)
				dico={}
				
	#obj.encours("plaveckycastle.png",listdico)
	WIDTH=100
	HEIGHT=100
	surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
	ctx = cairo.Context (surface)
	ctx.scale(surface.get_width(),surface.get_height())	
	ctx.set_source_rgb(0, 0, 0)
        ctx.rectangle(0.25, 0.25, 0.5, 0.5)
        ctx.fill()
	surface.write_to_png ("test.png")
	

